/*-------------------------------------------------------------------------
 *
 * pg_description.h
 *	  "描述" 系统目录 (pg_description) 的定义
 *
 * 由于此表的内容来自其他目录的 *.dat 文件，
 * 因此没有 pg_description.dat 文件。初始
 * 内容由 genbki.pl 汇总并在 initdb 期间加载。
 *
 * 注：一个对象通过主要定义该对象的行的 OID,
 * 以及该行所在表的 OID 来识别。
 * 例如，函数通过其 pg_proc 行的 OID 以及
 * pg_proc 表的 pg_class OID 来识别。这允许唯一
 * 标识对象，而不假设 OID 在表之间是唯一的。
 *
 * 由于属性没有自己的 OID，我们通过其父表的 objoid+classoid
 * 以及给定属性列号的 "objsubid" 来识别属性注释。
 * 表本身的注释中 "objsubid" 必须为零，以便与
 * 任何列注释区分。目前，objsubid 对于所有其他类型的
 * 对象都是未使用和零的，但或许将来与
 * 其他对象的组成元素（例如函数的参数）关联注释
 * 可能会有用。
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/catalog/pg_description.h
 *
 * NOTES
 *	  Catalog.pm 模块读取此文件并推导模式
 *	  信息。
 *
 *-------------------------------------------------------------------------
 */
#ifndef PG_DESCRIPTION_H
#define PG_DESCRIPTION_H

#include "catalog/genbki.h"
#include "catalog/pg_description_d.h"

/* ----------------
 *		pg_description 定义。 cpp 将其转换为
 *		typedef struct FormData_pg_description
 * ----------------
 */
CATALOG(pg_description,2609,DescriptionRelationId)
{
	Oid			objoid;			/* 对象本身的 OID */
	Oid			classoid;		/* 包含对象的表的 OID */
	int32		objsubid;		/* 列号，或 0 如果未使用 */

#ifdef CATALOG_VARLEN			/* 可变长度字段从这里开始 */
	text		description BKI_FORCE_NOT_NULL; /* 对象的描述 */
#endif
} FormData_pg_description;

/* ----------------
 *		Form_pg_description 对应于一个指向与
 *		pg_description 关系格式相符的元组的指针。
 * ----------------
 */
typedef FormData_pg_description * Form_pg_description;

DECLARE_TOAST(pg_description, 2834, 2835);

DECLARE_UNIQUE_INDEX_PKEY(pg_description_o_c_o_index, 2675, DescriptionObjIndexId, on pg_description using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops));

/* 我们在这里不使用 BKI_LOOKUP，因为它会导致 genbki.pl 出现问题 */
DECLARE_FOREIGN_KEY((classoid), pg_class, (oid));

#endif							/* PG_DESCRIPTION_H */
